# mysql(1) completion                                      -*- shell-script -*-

_mysql_character_sets()
{
    local IFS=$' \t\n' reset=$(shopt -p failglob)
    shopt -u failglob
    local -a charsets=(/usr/share/m{ariadb,ysql}/charsets/*.xml)
    $reset
    if ((${#charsets[@]})); then
        charsets=("${charsets[@]##*/}")
        charsets=("${charsets[@]%%?(Index|\*).xml}" utf8)
        COMPREPLY+=($(compgen -W '${charsets[@]}' -- "$cur"))
    fi
}

_mysql()
{
    local cur prev words cword split
    _init_completion -s || return

    case $prev in
        --user | -!(-*)u)
            COMPREPLY=($(compgen -u -- "$cur"))
            return
            ;;
        --database | -!(-*)D)
            COMPREPLY=($(compgen -W "$(mysqlshow 2>/dev/null | command sed -ne '2d' -e 's/^|.\([^|]*\)|.*/\1/p')" -- "$cur"))
            return
            ;;

        --host | -!(-*)h)
            _known_hosts_real -- "$cur"
            return
            ;;
        --default-character-set)
            _mysql_character_sets
            return
            ;;

        --character-sets-dir | --ssl-capath)
            _filedir -d
            return
            ;;
        --socket | -!(-*)S)
            _filedir sock
            return
            ;;
        --protocol)
            COMPREPLY=($(compgen -W 'tcp socket pipe memory' -- "$cur"))
            return
            ;;
        --defaults-file | --defaults-extra-file | --tee)
            _filedir
            return
            ;;
        --ssl-ca | --ssl-cert)
            _filedir '@(pem|cer|c?(e)rt)'
            return
            ;;
        --ssl-key)
            _filedir '@(pem|key)'
            return
            ;;
        --port | --set-variable | --ssl-cipher | --connect_timeout | \
            --max_allowed_packet | --prompt | --net_buffer_length | --select_limit | \
            --max_join_size | --server-arg | --debug | --delimiter | --execute | --pager | \
            -!(-*)[Pe])
            return
            ;;
        --help | --version | -!(-*)[?IV])
            return
            ;;
    esac

    $split && return

    case $cur in
        --*)
            local help=$(_parse_help "$1")
            help+=" --skip-comments --skip-ssl"

            COMPREPLY=($(compgen -W "$help" -- "$cur"))
            [[ ${COMPREPLY-} == *= ]] && compopt -o nospace
            return
            ;;

        # only complete long options
        -)
            compopt -o nospace
            COMPREPLY=(--)
            return
            ;;
    esac

    COMPREPLY=($(compgen -W \
        "$(mysqlshow 2>/dev/null | command sed -ne '2d' -e 's/^|.\([^|]*\)|.*/\1/p')" \
        -- "$cur"))
} &&
    complete -F _mysql mysql

# ex: filetype=sh
